package main

import (
	"fmt"
	"reflect"
)

// 2、使函数可以接收任意类型的值 ，也可以使用空接口
func random_param(iface interface{}) {
	fmt.Println(iface)
}

// 接收任意个任意类型的值 示例
func random_param_counter(ifaces ...interface{}) {
	for _, iface := range ifaces {
		fmt.Println(iface)
	}
}

// 查看传入值的类型和数值（利用反射机制和空接口）
func value_and_type(iface interface{}) {
	fmt.Printf("type: %s\t\tvalue: %v\n", reflect.TypeOf(iface), reflect.ValueOf(iface))
}

func main() {
	// 1、通常我们会直接使用 interface{} 作为类型声明一个实例，而这个实例可以承载任意类型的值。
	var i interface{}

	i = 1
	fmt.Println(i)

	i = "hello"
	fmt.Println(i)

	i = false
	fmt.Println(i)

	a := 1
	b := "hello"
	c := true
	random_param(a)
	random_param(b)
	random_param(c)

	random_param_counter(a, b, c)

	// 3、你也定义一个可以接收任意类型的 array、slice、map、strcut
	any := make([]interface{}, 5)
	any[0] = 11
	any[1] = "hello, go"
	any[2] = []int{1, 2, 3}
	for _, v := range any {
		value_and_type(v)
	}
}
